/*
 * $Id: EyeDropperColorChooserPanel.java 4082 2011-11-15 18:39:43Z kschaefe $
 *
 * Copyright 2008 Sun Microsystems, Inc., 4150 Network Circle,
 * Santa Clara, California 95054, U.S.A. All rights reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 */
package org.jdesktop.swingx.color;

import java.awt.AWTException;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JColorChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.colorchooser.AbstractColorChooserPanel;
import javax.swing.event.MouseInputAdapter;

import org.jdesktop.swingx.JXColorSelectionButton;
import org.jdesktop.swingx.util.PaintUtils;

/**
 * <p>
 * EyeDropperColorChooserPanel is a pluggable panel for the
 * {@link JColorChooser} which allows the user to grab any color from the screen
 * using a magnifying glass.
 * </p>
 *
 * <p>
 * Example usage:
 * </p>
 * 
 * <pre>
 * <code>
 *    public static void main(String ... args) {
 *         SwingUtilities.invokeLater(new Runnable() {
 *             public void run() {
 *                 JColorChooser chooser = new JColorChooser();
 *                 chooser.addChooserPanel(new EyeDropperColorChooserPanel());
 *                 JFrame frame = new JFrame();
 *                 frame.add(chooser);
 *                 frame.pack();
 *                 frame.setVisible(true);
 *             }
 *         });
 *     }
 * </code>
 * </pre>
 *
 * @author joshua@marinacci.org
 */
public class EyeDropperColorChooserPanel extends AbstractColorChooserPanel {

	/**
	 * Example usage
	 */
	public static void main(String... args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JColorChooser chooser = new JColorChooser();
				chooser.addChooserPanel(new EyeDropperColorChooserPanel());
				JFrame frame = new JFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.add(chooser);
				frame.pack();
				frame.setVisible(true);
			}
		});
	}

	/**
	 * Creates new EyeDropperColorChooserPanel
	 */
	public EyeDropperColorChooserPanel() {
		initComponents();
		MouseInputAdapter mia = new MouseInputAdapter() {
			@Override
			public void mousePressed(MouseEvent evt) {
			}

			@Override
			public void mouseDragged(MouseEvent evt) {
				Point pt = evt.getPoint();
				SwingUtilities.convertPointToScreen(pt, evt.getComponent());
				((MagnifyingPanel) magPanel).setMagPoint(pt);
			}

			@Override
			public void mouseReleased(MouseEvent evt) {
				Color newColor = new Color(((MagnifyingPanel) magPanel).activeColor);
				getColorSelectionModel().setSelectedColor(newColor);
			}
		};
		eyeDropper.addMouseListener(mia);
		eyeDropper.addMouseMotionListener(mia);
		try {
			eyeDropper.setIcon(new ImageIcon(EyeDropperColorChooserPanel.class.getResource("mag.png")));
			eyeDropper.setText("");
		} catch (Exception ex) {
			ex.printStackTrace();
		}

		magPanel.addPropertyChangeListener(new PropertyChangeListener() {
			public void propertyChange(PropertyChangeEvent evt) {
				Color color = new Color(((MagnifyingPanel) magPanel).activeColor);
				activeColor.setBackground(color);
				hexColor.setText(PaintUtils.toHexString(color).substring(1));
				rgbColor.setText(color.getRed() + "," + color.getGreen() + "," + color.getBlue());
			}
		});
	}

	private class MagnifyingPanel extends JPanel {
		private Point2D point;
		private int activeColor;

		public void setMagPoint(Point2D point) {
			this.point = point;
			repaint();
		}

		@Override
		public void paintComponent(Graphics g) {
			if (point != null) {
				Rectangle rect = new Rectangle((int) point.getX() - 10, (int) point.getY() - 10, 20, 20);
				try {
					BufferedImage img = new Robot().createScreenCapture(rect);
					g.drawImage(img, 0, 0, getWidth(), getHeight(), null);
					int oldColor = activeColor;
					activeColor = img.getRGB(img.getWidth() / 2, img.getHeight() / 2);
					firePropertyChange("activeColor", oldColor, activeColor);
				} catch (AWTException ex) {
					ex.printStackTrace();
				}
			}
			g.setColor(Color.black);
			g.drawRect(getWidth() / 2 - 5, getHeight() / 2 - 5, 10, 10);
		}
	}

	/**
	 * This method is called from within the constructor to initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is always
	 * regenerated by the Form Editor.
	 */
	// <editor-fold defaultstate="collapsed"
	// desc=" Generated Code ">//GEN-BEGIN:initComponents
	private void initComponents() {
		java.awt.GridBagConstraints gridBagConstraints;

		eyeDropper = new javax.swing.JButton();
		magPanel = new MagnifyingPanel();
		activeColor = new JXColorSelectionButton();
		hexColor = new javax.swing.JTextField();
		JTextArea jTextArea1 = new JTextArea();
		jLabel1 = new javax.swing.JLabel();
		rgbColor = new javax.swing.JTextField();
		JLabel jLabel2 = new JLabel();

		setLayout(new java.awt.GridBagLayout());

		eyeDropper.setText("eye");
		add(eyeDropper, new java.awt.GridBagConstraints());

		magPanel.setLayout(new java.awt.BorderLayout());

		magPanel.setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));
		magPanel.setMinimumSize(new java.awt.Dimension(100, 100));
		magPanel.setPreferredSize(new java.awt.Dimension(100, 100));
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 0;
		gridBagConstraints.gridy = 1;
		gridBagConstraints.gridheight = 3;
		gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
		gridBagConstraints.insets = new java.awt.Insets(0, 0, 0, 12);
		add(magPanel, gridBagConstraints);

		activeColor.setEnabled(false);
		activeColor.setPreferredSize(new java.awt.Dimension(40, 40));
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 2;
		gridBagConstraints.gridy = 3;
		gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
		gridBagConstraints.insets = new java.awt.Insets(2, 0, 2, 0);
		add(activeColor, gridBagConstraints);

		hexColor.setEditable(false);
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 2;
		gridBagConstraints.gridy = 1;
		gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
		gridBagConstraints.insets = new java.awt.Insets(2, 0, 2, 0);
		add(hexColor, gridBagConstraints);

		jTextArea1.setColumns(20);
		jTextArea1.setEditable(false);
		jTextArea1.setLineWrap(true);
		jTextArea1.setRows(5);
		jTextArea1.setText("Drag the magnifying glass to select a color from the screen.");
		jTextArea1.setWrapStyleWord(true);
		jTextArea1.setOpaque(false);
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridwidth = 2;
		gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
		gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
		gridBagConstraints.weightx = 10.0;
		gridBagConstraints.weighty = 10.0;
		gridBagConstraints.insets = new java.awt.Insets(0, 0, 7, 0);
		add(jTextArea1, gridBagConstraints);

		jLabel1.setText("#");
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 1;
		gridBagConstraints.gridy = 1;
		gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
		gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4);
		add(jLabel1, gridBagConstraints);

		rgbColor.setEditable(false);
		rgbColor.setText("255,255,255");
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 2;
		gridBagConstraints.gridy = 2;
		gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
		gridBagConstraints.insets = new java.awt.Insets(2, 0, 2, 0);
		add(rgbColor, gridBagConstraints);

		jLabel2.setText("RGB");
		gridBagConstraints = new java.awt.GridBagConstraints();
		gridBagConstraints.gridx = 1;
		gridBagConstraints.gridy = 2;
		gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
		gridBagConstraints.insets = new java.awt.Insets(0, 4, 0, 4);
		add(jLabel2, gridBagConstraints);

	}// </editor-fold>//GEN-END:initComponents

	// Variables declaration - do not modify//GEN-BEGIN:variables
	private javax.swing.JButton activeColor;
	private javax.swing.JButton eyeDropper;
	private javax.swing.JTextField hexColor;
	private javax.swing.JLabel jLabel1;
	private javax.swing.JPanel magPanel;
	private javax.swing.JTextField rgbColor;

	// End of variables declaration//GEN-END:variables

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void updateChooser() {
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	protected void buildChooser() {
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String getDisplayName() {
		return "Grab from Screen";
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public Icon getSmallDisplayIcon() {
		return new ImageIcon();
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public Icon getLargeDisplayIcon() {
		return new ImageIcon();
	}
}
